/*
 * CThread.h
 *
 *  Created on: 05.03.2012
 *      Author: caffeine
 *
 *      Модуль работы с потоками
 */

#ifndef __CThread_H_
#define __CThread_H_

#include <lampe/thread/IThread.h>
#include "../lib/threadlib.h"

namespace lampe{
namespace thread{

/**
 * @class CThread
 * Класс реализующий работу потоков.
 */
class CThread:public virtual IThread{
private:
	bool canceled;
protected:
	virtual bool onStart();
	virtual void onStop();
	static thread_function(clientWork,arg);
	virtual void threadRunning()=0;
public:

    /**
     * Метод, запускающий поток. Если поток УЖЕ запущен, то вызов метода никчему не приведёт
     * */
    virtual void start();

    /**
     * Метод остановки потока. Если поток УЖЕ остановлен, то вызов никчему не приведёт
     * */
    virtual void stop();
    virtual bool isRunning();
    virtual bool cancel();
    virtual void cancel(bool cancelled);
    virtual bool abort(lampe::u32 timeOut=0,lampe::u32 timeOutStep=10);



    /*
     * Конструктор
     * */
    CThread();

    /*
     * Диструктор
     * */
    virtual ~CThread();

	/***
	 * Метод который застовляет ждать поток откуда вызван метод окончания действия данного потока.
	 * Если вызвать для УЖЕ остановившегося потоке, то вызов ни к чему не привидёт.
	 *
	 * @param timeOut время (мс) в течении которого вызвавший поток будет ожидать завершения. Если вызываемый поток не закончился в течении указанного времени, то функция вернёт FALSE, если успел завершиться, то TRUE
	 * @param timeOutStep интервал времени (мс) через который будет проверятся закончил ли выполнение поток. Имеет смысль только при timeOut>0
	 * @return TRUE если поток успешно закончился, иначе FALSE. Имеет смысл проверять результат функции только если параметр timeOut>0
	 * */
	 virtual bool wait(lampe::u32 timeOut=0,lampe::u32 timeOutStep=10);
	
private:
	ThreadHeader header;
};

}//namespace thread
}//namespace lampe


#endif /* CThread_H_ */
